interface Todo {
	title: string
	description: string
	completed: boolean
}

// Pick<T, K extends keyof T>的作用是将某个类型中的子属性挑出来，变成包含这个类型部分属性的子类型
type TodoPreview = Pick<Todo, 'title' | 'completed'>

const todo: TodoPreview = {
	title: 'foo',
	completed: true
}

/*
* 如何定义一个 ConditionalPick 工具类型，支持根据指定的 Condition 条件来生成新的类型
* */
type StringKeysOnly = ConditionalPick<Todo, string>

type ConditionalPick<V, T> = {
	[K in keyof V as V[K] extends T ? K : never]: V[K]
}

// 测试
const todo2: StringKeysOnly = {
	title: 'ff',
	description: 'dd'
}
